Mencari Estimasi Turunan Fungsi dengan Ekstrapolasi Richardson

Ekstrapolasi Richardson

Ekstrapolasi Richardson adalah salah satu teknik menggabungkan dua nilai perkiraan yang dihitung diperoleh dengan menggunakan rumus yang sama atau metode dengan dua ukuran langkah yang berbeda, untuk mendapatkan metode orde tinggi yang menyediakan lebih dekat perkiraan jumlah tertentu.

Dalam extrapolasi Richardson ditetapkan $ f(x) $ dan $ x $ tertentu.
\varnothing(h) = {f(x+h) - f(x-h) \over 2h} \\ \varnothing(h) = f'(x) - a_2h^2 - a_4h_4 - a_6h_6- ... \\ \varnothing(h) = f'(x) - a_2{h \over 2}^2 - a_4{h \over 2}^4 - a_6{h \over 2}^6 -...\\ \varnothing(h)-4 \varnothing(h/2) = 3f'(x)-{3 \over 4} a_4h^4 - {15 \over 16} a_6h^6 -... \\ => f'(x)={4\over3} \varnothing(h/2) - {1\over3}\varnothing(h)+O(h^4)

Bentuk Tabel Extrapolasi Richardson adalah seperti berikut.

Tabel Richardson Extrapolation
$ D(0,0) = \varnothing(h) $
$ D(0,0) = \varnothing(h/2) $ $ D(1,1) $
$ D(0,0) = \varnothing(h/4) $ $ D(2,1) $ $ D(2,2) $
$ D(0,0) = \varnothing(h/8) $ $ D(3,1) $ $ D(3,1) $ $ D(3,3) $

Nilai kolom pertama atau D(n,0) = $ \varnothing {h\over 2^n} $ = Central Difference. dan pada kolom yang lain menggunakan $ D(n,m) = {4^m \over 4^m - 1}D(n,m-1) - {1 \over 4^m-1}D(n-1,m-1) $

Menghitung menggunakan Extrapolasi Richardson

Menghitung nilai numerik dari turunan $ f(x) = x^{cos(x)} $, pada $ x=0.6 $ dengan $ h=0.1 $
D(0,0) = \varnothing (h) = {f(x+h)-f(x-h) \over 2h} \\ D(1,0) = \varnothing (0.1) = {f(0.7)-f(0.5) \over 0.2} = 1.08483 \\ D(2,0) = \varnothing (0.05) = {f(0.65)-f(0.55) \over 0.2} = 1.08988 \\ D(3,0) = \varnothing (0.025) = {f(0.625)-f(0.575) \over 0.05} = 1.09115
Kemudian untuk D(n,m), m tidak samadengan 0. dihitung dengan cara berikut
D(n,m) = {4^m \over 4^m - 1}D(n,m-1) - {1 \over 4^m-1}D(n-1,m-1) \\ D(1,1) = {4 \over 3} D(1,0) - {1 \over 3}D(0,0) = 1.09156 \\ D(2,1) = {4 \over 3} D(2,0) - {1 \over 3}D(1,0) = 1.09157 \\ D(2,2) = {16 \over 15} D(2,1) - {1 \over 15}D(1,1) = 1.09157

Dari hasil perhitungan tersebut kemudian didapatkan nilai dalam bentuk tabel Richardson

Tabel Richardson
1,08483
1,08988 1,09156
1,09115 1,09157 1,09157

Pada tabel tersebut baris ke 3 kolom ke 3 adalah hasil estimasi terbaik dari turunan suatu fungsi $ f(x) = x^{cos(x)} $ pada $ x=0.6 $ yaitu 1,09157.

Penerapan Extrapolasi Richardson dengan Python

import math
from numpy import zeros

def Oh(x,h):
    return (f(x + h) - f(x - h)) / (2*h)

def richardson_extrapolation(f, x, h, n):
    D = zeros((n+1,n+1))
    for i in range(n+1):
        for j in range(i+1):
            if j==0:
                D[i,0] = round(Oh(x, h/(2**i)), 5)
            else:
                D[i,j] = round(((4**j) / ((4**j) - 1) * D[i,j-1]) - (1 / ((4**j) - 1) * D[i-1, j-1]), 5)

        print(D[i, 0:i+1])
    return D

def f(x):
    return x**math.cos(x)

x = 0.6
h = 0.1
n = 2

print('=Tabel Richardson=\n')
print('f(x) = x^cos(x)\n')
hasil = richardson_extrapolation(f, x, h, n)
print('hasil estimasi terbaik adalah', hasil[n,n])

Pada program tersebut menggunakan bantuan dari library numpy untuk menampung nilai hasil perhitungan dalam bentuk array matriks. dan library math yang berisi banyak sekali fungsi matematika.

import math
from numpy import zeros

Kemudian terdapat fungsi Oh(x, h) yang merupakan fungsi untuk beda terpusat (Central Difference) yaitu $ f'(x) = {f(x+h) - f(x-h) \over 2h} $

def Oh(x,h):
    return (f(x + h) - f(x - h)) / (2*h)

Kemudian terdapat fungsi richardson extrapolation(f, x, h, n) dengan f merupakan fungsi yang didefinisikan, x dan h merupakan nilai yang telah didefinisikan, dan n merupakan banyak iterasi/panjang tabel n x n. Di fungsi ini library numpy baru digunakan yaitu zeros((n+1,n+1)) untuk membetuk arrar 0 sepanjang n. kemudian melakukan iterasi untuk menghitung D(0,0) sampai D(n,m). saat iterasi j adalah 0 maka akan menghitung $ D(n,0) = \varnothing (h) = {f(x+h)-f(x-h) \over 2h} $, selain itu akan menghitung $ D(n,m) = {4^m \over 4^m - 1}D(n,m-1) - {1 \over 4^m-1}D(n-1,m-1) $

def richardson_extrapolation(f, x, h, n):
    D = zeros((n+1,n+1))
    for i in range(n+1):
        for j in range(i+1):
            if j==0:
                D[i,0] = round(Oh(x, h/(2**i)), 5)
            else:
                D[i,j] = round(((4**j) / ((4**j) - 1) * D[i,j-1]) - (1 / ((4**j) - 1) * D[i-1, j-1]), 5)

        print(D[i, 0:i+1])
    return D

Kemudian membuat fungsi yang akan dihitung turunannya. Dalam program tersebut fungsi yang digunakan adalah $ f(x) = x^{cox(x)} $ dengan x=0.6, h=0.1, dan n=2.

def f(x):
    return x**math.cos(x)

x = 0.6
h = 0.1
n = 2

Saat program tersebut dijalankan maka menghasilkan output seperti berikut.

=Tabel Richardson=

f(x) = x^cos(x)

[1.08483 ]
[1.08988    1.09156]
[1.09115    1.09157     1.09157]
hasil estimasi terbaik adalah 1.09157

Sekian terimakasih:)